/*
提交链接：https://leetcode.cn/problems/min-cost-climbing-stairs/submissions/562542373
746. 使用最小花费爬楼梯-简单
完成日期：2024/9/8
线性dp
*/

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        // 如果只有两个台阶，直接返回两者中的最小值
        if (n == 2) return min(cost[0], cost[1]);
        // 动态规划数组
        vector<int> dp(n);
        // 初始化前两个台阶的费用
        dp[0] = cost[0];
        dp[1] = cost[1];
        // 从第三个台阶开始计算
        for (int i = 2; i < n; ++i) {
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
        }
        // 最低花费为到达倒数第二个台阶和最后一个台阶的最小值
        return min(dp[n-1], dp[n-2]);
    }
};